[404218]: / Code / Tensor Network vs FC Explainability / Dataset 3 / DS3 3TN TPU kkawchak.ipynb

Download this file

1259 lines (1259 with data), 129.4 kB

{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": [],
      "machine_shape": "hm",
      "gpuType": "V28"
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "TPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "8XnVMPBXmtRa"
      },
      "source": [
        "# TensorNetworks in Neural Networks.\n",
        "\n",
        "Here, we have a small toy example of how to use a TN inside of a fully connected neural network.\n",
        "\n",
        "First off, let's install tensornetwork"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "7HGRsYNAFxME"
      },
      "source": [
        "# !pip install tensornetwork\n",
        "\n",
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import tensorflow as tf\n",
        "# Import tensornetwork\n",
        "import tensornetwork as tn\n",
        "import random\n",
        "import time\n",
        "import pandas as pd\n",
        "# Set the backend to tesorflow\n",
        "# (default is numpy)\n",
        "tn.set_default_backend(\"tensorflow\")\n",
        "np.random.seed(42)\n",
        "random.seed(42)\n",
        "tf.random.set_seed(42)\n",
        "# Explainability code assistance aided by ChatGPT3.5\n",
        "# 2021 Kelly, D. TensorFlow Explainable AI tutorial https://www.youtube.com/watch?v=6xePkn3-LME"
      ],
      "execution_count": 35,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "g1OMCo5XmrYu"
      },
      "source": [
        "# TensorNetwork layer definition\n",
        "\n",
        "Here, we define the TensorNetwork layer we wish to use to replace the fully connected layer. Here, we simply use a 2 node Matrix Product Operator network to replace the normal dense weight matrix.\n",
        "\n",
        "We TensorNetwork's NCon API to keep the code short."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "wvSMKtPufnLp"
      },
      "source": [
        "class TNLayer(tf.keras.layers.Layer):\n",
        "\n",
        "  def __init__(self):\n",
        "    super(TNLayer, self).__init__()\n",
        "    # Create the variables for the layer.\n",
        "    self.a_var = tf.Variable(tf.random.normal(shape=(32, 32, 2),\n",
        "                                              stddev=1.0/32.0),\n",
        "                             name=\"a\", trainable=True)\n",
        "    self.b_var = tf.Variable(tf.random.normal(shape=(32, 32, 2),\n",
        "                                              stddev=1.0/32.0),\n",
        "                             name=\"b\", trainable=True)\n",
        "    self.bias = tf.Variable(tf.zeros(shape=(32, 32)),\n",
        "                            name=\"bias\", trainable=True)\n",
        "\n",
        "  def call(self, inputs):\n",
        "    # Define the contraction.\n",
        "    # We break it out so we can parallelize a batch using\n",
        "    # tf.vectorized_map (see below).\n",
        "    def f(input_vec, a_var, b_var, bias_var):\n",
        "      # Reshape to a matrix instead of a vector.\n",
        "      input_vec = tf.reshape(input_vec, (32, 32))\n",
        "\n",
        "      # Now we create the network.\n",
        "      a = tn.Node(a_var)\n",
        "      b = tn.Node(b_var)\n",
        "      x_node = tn.Node(input_vec)\n",
        "      a[1] ^ x_node[0]\n",
        "      b[1] ^ x_node[1]\n",
        "      a[2] ^ b[2]\n",
        "\n",
        "      # The TN should now look like this\n",
        "      #   |     |\n",
        "      #   a --- b\n",
        "      #    \\   /\n",
        "      #      x\n",
        "\n",
        "      # Now we begin the contraction.\n",
        "      c = a @ x_node\n",
        "      result = (c @ b).tensor\n",
        "\n",
        "      # To make the code shorter, we also could've used Ncon.\n",
        "      # The above few lines of code is the same as this:\n",
        "      # result = tn.ncon([x, a_var, b_var], [[1, 2], [-1, 1, 3], [-2, 2, 3]])\n",
        "\n",
        "      # Finally, add bias.\n",
        "      return result + bias_var\n",
        "\n",
        "    # To deal with a batch of items, we can use the tf.vectorized_map\n",
        "    # function.\n",
        "    # https://www.tensorflow.org/api_docs/python/tf/vectorized_map\n",
        "    result = tf.vectorized_map(\n",
        "        lambda vec: f(vec, self.a_var, self.b_var, self.bias), inputs)\n",
        "    return tf.nn.relu(tf.reshape(result, (-1, 1024)))"
      ],
      "execution_count": 36,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "V-CVqIhPnhY_"
      },
      "source": [
        "# Smaller model\n",
        "These two models are effectively the same, but notice how the TN layer has nearly 10x fewer parameters."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "bbKsmK8wIFTp",
        "outputId": "635a50fc-6e0d-42d8-d660-039833b48d5a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        }
      },
      "source": [
        "Dense = tf.keras.layers.Dense\n",
        "tn_model = tf.keras.Sequential(\n",
        "    [\n",
        "     tf.keras.Input(shape=(2,)),\n",
        "     Dense(1024, activation=tf.nn.relu),\n",
        "     # Start Modified Layers\n",
        "     TNLayer(),\n",
        "     TNLayer(),\n",
        "     TNLayer(),\n",
        "     # Finish Modified Layers\n",
        "     Dense(1, activation=None)])\n",
        "tn_model.summary()"
      ],
      "execution_count": 37,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Model: \"sequential_3\"\n",
            "_________________________________________________________________\n",
            " Layer (type)                Output Shape              Param #   \n",
            "=================================================================\n",
            " dense_6 (Dense)             (None, 1024)              3072      \n",
            "                                                                 \n",
            " tn_layer_9 (TNLayer)        (None, 1024)              5120      \n",
            "                                                                 \n",
            " tn_layer_10 (TNLayer)       (None, 1024)              5120      \n",
            "                                                                 \n",
            " tn_layer_11 (TNLayer)       (None, 1024)              5120      \n",
            "                                                                 \n",
            " dense_7 (Dense)             (None, 1)                 1025      \n",
            "                                                                 \n",
            "=================================================================\n",
            "Total params: 19457 (76.00 KB)\n",
            "Trainable params: 19457 (76.00 KB)\n",
            "Non-trainable params: 0 (0.00 Byte)\n",
            "_________________________________________________________________\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "GWwoYp0WnsLA"
      },
      "source": [
        "# Training a model\n",
        "\n",
        "You can train the TN model just as you would a normal neural network model! Here, we give an example of how to do it in Keras."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "qDFzOC7sDBJ-"
      },
      "source": [
        "# Generate points forming a spiral\n",
        "theta = np.linspace(0, 4*np.pi, 480)\n",
        "r = np.linspace(0, 1, 480)\n",
        "\n",
        "x = r * np.sin(theta)\n",
        "y = r * np.cos(theta)\n",
        "\n",
        "X = np.column_stack((x, y))\n",
        "Y = np.concatenate([np.ones((240)), -np.ones((240))])"
      ],
      "execution_count": 38,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "seconds = time.time()\n",
        "print(\"Time in seconds since beginning of run:\", seconds)\n",
        "local_time = time.ctime(seconds)\n",
        "print(local_time)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "19TWP-1eKURB",
        "outputId": "f13148a7-8f34-4fee-d8c5-9cc4f5aa78db"
      },
      "execution_count": 39,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Time in seconds since beginning of run: 1712717167.60743\n",
            "Wed Apr 10 02:46:07 2024\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "crc0q1vbIyTj",
        "outputId": "08b1b701-c1f7-4139-ded6-81f8503f58f8",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        }
      },
      "source": [
        "tn_model.compile(optimizer=\"adam\", loss=\"mean_squared_error\")\n",
        "tn_model.fit(X, Y, epochs=300, verbose=2)"
      ],
      "execution_count": 40,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Epoch 1/300\n",
            "15/15 - 1s - loss: 1.0019 - 1s/epoch - 94ms/step\n",
            "Epoch 2/300\n",
            "15/15 - 0s - loss: 1.0001 - 70ms/epoch - 5ms/step\n",
            "Epoch 3/300\n",
            "15/15 - 0s - loss: 1.0003 - 70ms/epoch - 5ms/step\n",
            "Epoch 4/300\n",
            "15/15 - 0s - loss: 1.0001 - 70ms/epoch - 5ms/step\n",
            "Epoch 5/300\n",
            "15/15 - 0s - loss: 0.9862 - 61ms/epoch - 4ms/step\n",
            "Epoch 6/300\n",
            "15/15 - 0s - loss: 0.4949 - 67ms/epoch - 4ms/step\n",
            "Epoch 7/300\n",
            "15/15 - 0s - loss: 0.0453 - 67ms/epoch - 4ms/step\n",
            "Epoch 8/300\n",
            "15/15 - 0s - loss: 0.0175 - 65ms/epoch - 4ms/step\n",
            "Epoch 9/300\n",
            "15/15 - 0s - loss: 0.0123 - 64ms/epoch - 4ms/step\n",
            "Epoch 10/300\n",
            "15/15 - 0s - loss: 0.0126 - 62ms/epoch - 4ms/step\n",
            "Epoch 11/300\n",
            "15/15 - 0s - loss: 0.0112 - 59ms/epoch - 4ms/step\n",
            "Epoch 12/300\n",
            "15/15 - 0s - loss: 0.0215 - 63ms/epoch - 4ms/step\n",
            "Epoch 13/300\n",
            "15/15 - 0s - loss: 0.0145 - 61ms/epoch - 4ms/step\n",
            "Epoch 14/300\n",
            "15/15 - 0s - loss: 0.0104 - 60ms/epoch - 4ms/step\n",
            "Epoch 15/300\n",
            "15/15 - 0s - loss: 0.0103 - 59ms/epoch - 4ms/step\n",
            "Epoch 16/300\n",
            "15/15 - 0s - loss: 0.0075 - 61ms/epoch - 4ms/step\n",
            "Epoch 17/300\n",
            "15/15 - 0s - loss: 0.0076 - 62ms/epoch - 4ms/step\n",
            "Epoch 18/300\n",
            "15/15 - 0s - loss: 0.0073 - 60ms/epoch - 4ms/step\n",
            "Epoch 19/300\n",
            "15/15 - 0s - loss: 0.0064 - 59ms/epoch - 4ms/step\n",
            "Epoch 20/300\n",
            "15/15 - 0s - loss: 0.0072 - 59ms/epoch - 4ms/step\n",
            "Epoch 21/300\n",
            "15/15 - 0s - loss: 0.0071 - 61ms/epoch - 4ms/step\n",
            "Epoch 22/300\n",
            "15/15 - 0s - loss: 0.0080 - 58ms/epoch - 4ms/step\n",
            "Epoch 23/300\n",
            "15/15 - 0s - loss: 0.0098 - 58ms/epoch - 4ms/step\n",
            "Epoch 24/300\n",
            "15/15 - 0s - loss: 0.0235 - 59ms/epoch - 4ms/step\n",
            "Epoch 25/300\n",
            "15/15 - 0s - loss: 0.0084 - 59ms/epoch - 4ms/step\n",
            "Epoch 26/300\n",
            "15/15 - 0s - loss: 0.0054 - 57ms/epoch - 4ms/step\n",
            "Epoch 27/300\n",
            "15/15 - 0s - loss: 0.0151 - 59ms/epoch - 4ms/step\n",
            "Epoch 28/300\n",
            "15/15 - 0s - loss: 0.0079 - 59ms/epoch - 4ms/step\n",
            "Epoch 29/300\n",
            "15/15 - 0s - loss: 0.0106 - 58ms/epoch - 4ms/step\n",
            "Epoch 30/300\n",
            "15/15 - 0s - loss: 0.0077 - 60ms/epoch - 4ms/step\n",
            "Epoch 31/300\n",
            "15/15 - 0s - loss: 0.0046 - 60ms/epoch - 4ms/step\n",
            "Epoch 32/300\n",
            "15/15 - 0s - loss: 0.0047 - 59ms/epoch - 4ms/step\n",
            "Epoch 33/300\n",
            "15/15 - 0s - loss: 0.0063 - 58ms/epoch - 4ms/step\n",
            "Epoch 34/300\n",
            "15/15 - 0s - loss: 0.0075 - 59ms/epoch - 4ms/step\n",
            "Epoch 35/300\n",
            "15/15 - 0s - loss: 0.0036 - 63ms/epoch - 4ms/step\n",
            "Epoch 36/300\n",
            "15/15 - 0s - loss: 0.0060 - 60ms/epoch - 4ms/step\n",
            "Epoch 37/300\n",
            "15/15 - 0s - loss: 0.0104 - 62ms/epoch - 4ms/step\n",
            "Epoch 38/300\n",
            "15/15 - 0s - loss: 0.0156 - 59ms/epoch - 4ms/step\n",
            "Epoch 39/300\n",
            "15/15 - 0s - loss: 0.0026 - 64ms/epoch - 4ms/step\n",
            "Epoch 40/300\n",
            "15/15 - 0s - loss: 0.0045 - 61ms/epoch - 4ms/step\n",
            "Epoch 41/300\n",
            "15/15 - 0s - loss: 0.0096 - 61ms/epoch - 4ms/step\n",
            "Epoch 42/300\n",
            "15/15 - 0s - loss: 0.0047 - 60ms/epoch - 4ms/step\n",
            "Epoch 43/300\n",
            "15/15 - 0s - loss: 0.0042 - 60ms/epoch - 4ms/step\n",
            "Epoch 44/300\n",
            "15/15 - 0s - loss: 0.0035 - 62ms/epoch - 4ms/step\n",
            "Epoch 45/300\n",
            "15/15 - 0s - loss: 0.0043 - 62ms/epoch - 4ms/step\n",
            "Epoch 46/300\n",
            "15/15 - 0s - loss: 0.0038 - 64ms/epoch - 4ms/step\n",
            "Epoch 47/300\n",
            "15/15 - 0s - loss: 0.0068 - 63ms/epoch - 4ms/step\n",
            "Epoch 48/300\n",
            "15/15 - 0s - loss: 0.0030 - 63ms/epoch - 4ms/step\n",
            "Epoch 49/300\n",
            "15/15 - 0s - loss: 0.0067 - 63ms/epoch - 4ms/step\n",
            "Epoch 50/300\n",
            "15/15 - 0s - loss: 0.0020 - 64ms/epoch - 4ms/step\n",
            "Epoch 51/300\n",
            "15/15 - 0s - loss: 0.0061 - 61ms/epoch - 4ms/step\n",
            "Epoch 52/300\n",
            "15/15 - 0s - loss: 0.0041 - 64ms/epoch - 4ms/step\n",
            "Epoch 53/300\n",
            "15/15 - 0s - loss: 0.0038 - 65ms/epoch - 4ms/step\n",
            "Epoch 54/300\n",
            "15/15 - 0s - loss: 0.0027 - 64ms/epoch - 4ms/step\n",
            "Epoch 55/300\n",
            "15/15 - 0s - loss: 0.0032 - 68ms/epoch - 5ms/step\n",
            "Epoch 56/300\n",
            "15/15 - 0s - loss: 0.0049 - 65ms/epoch - 4ms/step\n",
            "Epoch 57/300\n",
            "15/15 - 0s - loss: 0.0107 - 61ms/epoch - 4ms/step\n",
            "Epoch 58/300\n",
            "15/15 - 0s - loss: 0.0024 - 66ms/epoch - 4ms/step\n",
            "Epoch 59/300\n",
            "15/15 - 0s - loss: 0.0034 - 63ms/epoch - 4ms/step\n",
            "Epoch 60/300\n",
            "15/15 - 0s - loss: 0.0028 - 62ms/epoch - 4ms/step\n",
            "Epoch 61/300\n",
            "15/15 - 0s - loss: 0.0044 - 61ms/epoch - 4ms/step\n",
            "Epoch 62/300\n",
            "15/15 - 0s - loss: 0.0056 - 63ms/epoch - 4ms/step\n",
            "Epoch 63/300\n",
            "15/15 - 0s - loss: 0.0086 - 61ms/epoch - 4ms/step\n",
            "Epoch 64/300\n",
            "15/15 - 0s - loss: 0.0039 - 62ms/epoch - 4ms/step\n",
            "Epoch 65/300\n",
            "15/15 - 0s - loss: 0.0035 - 62ms/epoch - 4ms/step\n",
            "Epoch 66/300\n",
            "15/15 - 0s - loss: 0.0118 - 70ms/epoch - 5ms/step\n",
            "Epoch 67/300\n",
            "15/15 - 0s - loss: 0.0030 - 69ms/epoch - 5ms/step\n",
            "Epoch 68/300\n",
            "15/15 - 0s - loss: 0.0024 - 69ms/epoch - 5ms/step\n",
            "Epoch 69/300\n",
            "15/15 - 0s - loss: 0.0025 - 68ms/epoch - 5ms/step\n",
            "Epoch 70/300\n",
            "15/15 - 0s - loss: 0.0025 - 67ms/epoch - 4ms/step\n",
            "Epoch 71/300\n",
            "15/15 - 0s - loss: 0.0080 - 65ms/epoch - 4ms/step\n",
            "Epoch 72/300\n",
            "15/15 - 0s - loss: 0.0075 - 64ms/epoch - 4ms/step\n",
            "Epoch 73/300\n",
            "15/15 - 0s - loss: 0.0019 - 63ms/epoch - 4ms/step\n",
            "Epoch 74/300\n",
            "15/15 - 0s - loss: 0.0141 - 65ms/epoch - 4ms/step\n",
            "Epoch 75/300\n",
            "15/15 - 0s - loss: 5.9019e-04 - 63ms/epoch - 4ms/step\n",
            "Epoch 76/300\n",
            "15/15 - 0s - loss: 0.0054 - 66ms/epoch - 4ms/step\n",
            "Epoch 77/300\n",
            "15/15 - 0s - loss: 0.0048 - 61ms/epoch - 4ms/step\n",
            "Epoch 78/300\n",
            "15/15 - 0s - loss: 0.0041 - 66ms/epoch - 4ms/step\n",
            "Epoch 79/300\n",
            "15/15 - 0s - loss: 0.0024 - 65ms/epoch - 4ms/step\n",
            "Epoch 80/300\n",
            "15/15 - 0s - loss: 0.0054 - 65ms/epoch - 4ms/step\n",
            "Epoch 81/300\n",
            "15/15 - 0s - loss: 0.0091 - 68ms/epoch - 5ms/step\n",
            "Epoch 82/300\n",
            "15/15 - 0s - loss: 0.0169 - 67ms/epoch - 4ms/step\n",
            "Epoch 83/300\n",
            "15/15 - 0s - loss: 0.0050 - 66ms/epoch - 4ms/step\n",
            "Epoch 84/300\n",
            "15/15 - 0s - loss: 0.0041 - 66ms/epoch - 4ms/step\n",
            "Epoch 85/300\n",
            "15/15 - 0s - loss: 0.0032 - 66ms/epoch - 4ms/step\n",
            "Epoch 86/300\n",
            "15/15 - 0s - loss: 0.0033 - 65ms/epoch - 4ms/step\n",
            "Epoch 87/300\n",
            "15/15 - 0s - loss: 0.0028 - 65ms/epoch - 4ms/step\n",
            "Epoch 88/300\n",
            "15/15 - 0s - loss: 0.0032 - 70ms/epoch - 5ms/step\n",
            "Epoch 89/300\n",
            "15/15 - 0s - loss: 0.0019 - 68ms/epoch - 5ms/step\n",
            "Epoch 90/300\n",
            "15/15 - 0s - loss: 0.0036 - 67ms/epoch - 4ms/step\n",
            "Epoch 91/300\n",
            "15/15 - 0s - loss: 0.0056 - 66ms/epoch - 4ms/step\n",
            "Epoch 92/300\n",
            "15/15 - 0s - loss: 0.0021 - 66ms/epoch - 4ms/step\n",
            "Epoch 93/300\n",
            "15/15 - 0s - loss: 0.0020 - 65ms/epoch - 4ms/step\n",
            "Epoch 94/300\n",
            "15/15 - 0s - loss: 0.0041 - 57ms/epoch - 4ms/step\n",
            "Epoch 95/300\n",
            "15/15 - 0s - loss: 0.0067 - 56ms/epoch - 4ms/step\n",
            "Epoch 96/300\n",
            "15/15 - 0s - loss: 0.0017 - 55ms/epoch - 4ms/step\n",
            "Epoch 97/300\n",
            "15/15 - 0s - loss: 0.0032 - 56ms/epoch - 4ms/step\n",
            "Epoch 98/300\n",
            "15/15 - 0s - loss: 0.0059 - 57ms/epoch - 4ms/step\n",
            "Epoch 99/300\n",
            "15/15 - 0s - loss: 0.0022 - 57ms/epoch - 4ms/step\n",
            "Epoch 100/300\n",
            "15/15 - 0s - loss: 0.0034 - 56ms/epoch - 4ms/step\n",
            "Epoch 101/300\n",
            "15/15 - 0s - loss: 0.0059 - 57ms/epoch - 4ms/step\n",
            "Epoch 102/300\n",
            "15/15 - 0s - loss: 0.0088 - 56ms/epoch - 4ms/step\n",
            "Epoch 103/300\n",
            "15/15 - 0s - loss: 1.8834e-04 - 58ms/epoch - 4ms/step\n",
            "Epoch 104/300\n",
            "15/15 - 0s - loss: 0.0090 - 59ms/epoch - 4ms/step\n",
            "Epoch 105/300\n",
            "15/15 - 0s - loss: 0.0022 - 60ms/epoch - 4ms/step\n",
            "Epoch 106/300\n",
            "15/15 - 0s - loss: 0.0078 - 56ms/epoch - 4ms/step\n",
            "Epoch 107/300\n",
            "15/15 - 0s - loss: 0.0045 - 55ms/epoch - 4ms/step\n",
            "Epoch 108/300\n",
            "15/15 - 0s - loss: 0.0036 - 56ms/epoch - 4ms/step\n",
            "Epoch 109/300\n",
            "15/15 - 0s - loss: 0.0023 - 56ms/epoch - 4ms/step\n",
            "Epoch 110/300\n",
            "15/15 - 0s - loss: 0.0022 - 62ms/epoch - 4ms/step\n",
            "Epoch 111/300\n",
            "15/15 - 0s - loss: 0.0038 - 59ms/epoch - 4ms/step\n",
            "Epoch 112/300\n",
            "15/15 - 0s - loss: 0.0023 - 60ms/epoch - 4ms/step\n",
            "Epoch 113/300\n",
            "15/15 - 0s - loss: 0.0035 - 61ms/epoch - 4ms/step\n",
            "Epoch 114/300\n",
            "15/15 - 0s - loss: 0.0017 - 61ms/epoch - 4ms/step\n",
            "Epoch 115/300\n",
            "15/15 - 0s - loss: 0.0031 - 58ms/epoch - 4ms/step\n",
            "Epoch 116/300\n",
            "15/15 - 0s - loss: 0.0061 - 66ms/epoch - 4ms/step\n",
            "Epoch 117/300\n",
            "15/15 - 0s - loss: 0.0020 - 56ms/epoch - 4ms/step\n",
            "Epoch 118/300\n",
            "15/15 - 0s - loss: 0.0037 - 60ms/epoch - 4ms/step\n",
            "Epoch 119/300\n",
            "15/15 - 0s - loss: 0.0050 - 59ms/epoch - 4ms/step\n",
            "Epoch 120/300\n",
            "15/15 - 0s - loss: 0.0098 - 59ms/epoch - 4ms/step\n",
            "Epoch 121/300\n",
            "15/15 - 0s - loss: 0.0028 - 60ms/epoch - 4ms/step\n",
            "Epoch 122/300\n",
            "15/15 - 0s - loss: 0.0025 - 60ms/epoch - 4ms/step\n",
            "Epoch 123/300\n",
            "15/15 - 0s - loss: 0.0041 - 60ms/epoch - 4ms/step\n",
            "Epoch 124/300\n",
            "15/15 - 0s - loss: 0.0036 - 59ms/epoch - 4ms/step\n",
            "Epoch 125/300\n",
            "15/15 - 0s - loss: 0.0017 - 59ms/epoch - 4ms/step\n",
            "Epoch 126/300\n",
            "15/15 - 0s - loss: 0.0025 - 56ms/epoch - 4ms/step\n",
            "Epoch 127/300\n",
            "15/15 - 0s - loss: 0.0043 - 60ms/epoch - 4ms/step\n",
            "Epoch 128/300\n",
            "15/15 - 0s - loss: 0.0043 - 57ms/epoch - 4ms/step\n",
            "Epoch 129/300\n",
            "15/15 - 0s - loss: 0.0024 - 60ms/epoch - 4ms/step\n",
            "Epoch 130/300\n",
            "15/15 - 0s - loss: 0.0018 - 61ms/epoch - 4ms/step\n",
            "Epoch 131/300\n",
            "15/15 - 0s - loss: 0.0011 - 57ms/epoch - 4ms/step\n",
            "Epoch 132/300\n",
            "15/15 - 0s - loss: 0.0041 - 58ms/epoch - 4ms/step\n",
            "Epoch 133/300\n",
            "15/15 - 0s - loss: 0.0043 - 57ms/epoch - 4ms/step\n",
            "Epoch 134/300\n",
            "15/15 - 0s - loss: 0.0055 - 58ms/epoch - 4ms/step\n",
            "Epoch 135/300\n",
            "15/15 - 0s - loss: 0.0021 - 61ms/epoch - 4ms/step\n",
            "Epoch 136/300\n",
            "15/15 - 0s - loss: 0.0031 - 59ms/epoch - 4ms/step\n",
            "Epoch 137/300\n",
            "15/15 - 0s - loss: 0.0017 - 59ms/epoch - 4ms/step\n",
            "Epoch 138/300\n",
            "15/15 - 0s - loss: 0.0034 - 61ms/epoch - 4ms/step\n",
            "Epoch 139/300\n",
            "15/15 - 0s - loss: 0.0012 - 57ms/epoch - 4ms/step\n",
            "Epoch 140/300\n",
            "15/15 - 0s - loss: 0.0018 - 58ms/epoch - 4ms/step\n",
            "Epoch 141/300\n",
            "15/15 - 0s - loss: 0.0071 - 56ms/epoch - 4ms/step\n",
            "Epoch 142/300\n",
            "15/15 - 0s - loss: 0.0071 - 56ms/epoch - 4ms/step\n",
            "Epoch 143/300\n",
            "15/15 - 0s - loss: 0.0033 - 56ms/epoch - 4ms/step\n",
            "Epoch 144/300\n",
            "15/15 - 0s - loss: 0.0025 - 56ms/epoch - 4ms/step\n",
            "Epoch 145/300\n",
            "15/15 - 0s - loss: 0.0019 - 58ms/epoch - 4ms/step\n",
            "Epoch 146/300\n",
            "15/15 - 0s - loss: 0.0027 - 58ms/epoch - 4ms/step\n",
            "Epoch 147/300\n",
            "15/15 - 0s - loss: 0.0034 - 56ms/epoch - 4ms/step\n",
            "Epoch 148/300\n",
            "15/15 - 0s - loss: 0.0055 - 56ms/epoch - 4ms/step\n",
            "Epoch 149/300\n",
            "15/15 - 0s - loss: 0.0103 - 56ms/epoch - 4ms/step\n",
            "Epoch 150/300\n",
            "15/15 - 0s - loss: 0.0048 - 55ms/epoch - 4ms/step\n",
            "Epoch 151/300\n",
            "15/15 - 0s - loss: 0.0021 - 56ms/epoch - 4ms/step\n",
            "Epoch 152/300\n",
            "15/15 - 0s - loss: 0.0044 - 57ms/epoch - 4ms/step\n",
            "Epoch 153/300\n",
            "15/15 - 0s - loss: 0.0019 - 56ms/epoch - 4ms/step\n",
            "Epoch 154/300\n",
            "15/15 - 0s - loss: 0.0025 - 56ms/epoch - 4ms/step\n",
            "Epoch 155/300\n",
            "15/15 - 0s - loss: 0.0013 - 59ms/epoch - 4ms/step\n",
            "Epoch 156/300\n",
            "15/15 - 0s - loss: 0.0032 - 58ms/epoch - 4ms/step\n",
            "Epoch 157/300\n",
            "15/15 - 0s - loss: 0.0045 - 61ms/epoch - 4ms/step\n",
            "Epoch 158/300\n",
            "15/15 - 0s - loss: 0.0012 - 64ms/epoch - 4ms/step\n",
            "Epoch 159/300\n",
            "15/15 - 0s - loss: 0.0035 - 59ms/epoch - 4ms/step\n",
            "Epoch 160/300\n",
            "15/15 - 0s - loss: 0.0042 - 60ms/epoch - 4ms/step\n",
            "Epoch 161/300\n",
            "15/15 - 0s - loss: 0.0051 - 62ms/epoch - 4ms/step\n",
            "Epoch 162/300\n",
            "15/15 - 0s - loss: 0.0041 - 64ms/epoch - 4ms/step\n",
            "Epoch 163/300\n",
            "15/15 - 0s - loss: 0.0064 - 61ms/epoch - 4ms/step\n",
            "Epoch 164/300\n",
            "15/15 - 0s - loss: 0.0109 - 60ms/epoch - 4ms/step\n",
            "Epoch 165/300\n",
            "15/15 - 0s - loss: 0.0036 - 64ms/epoch - 4ms/step\n",
            "Epoch 166/300\n",
            "15/15 - 0s - loss: 0.0031 - 68ms/epoch - 5ms/step\n",
            "Epoch 167/300\n",
            "15/15 - 0s - loss: 0.0026 - 67ms/epoch - 4ms/step\n",
            "Epoch 168/300\n",
            "15/15 - 0s - loss: 0.0021 - 68ms/epoch - 5ms/step\n",
            "Epoch 169/300\n",
            "15/15 - 0s - loss: 0.0027 - 67ms/epoch - 4ms/step\n",
            "Epoch 170/300\n",
            "15/15 - 0s - loss: 0.0024 - 64ms/epoch - 4ms/step\n",
            "Epoch 171/300\n",
            "15/15 - 0s - loss: 0.0026 - 64ms/epoch - 4ms/step\n",
            "Epoch 172/300\n",
            "15/15 - 0s - loss: 0.0029 - 68ms/epoch - 5ms/step\n",
            "Epoch 173/300\n",
            "15/15 - 0s - loss: 0.0019 - 65ms/epoch - 4ms/step\n",
            "Epoch 174/300\n",
            "15/15 - 0s - loss: 0.0018 - 63ms/epoch - 4ms/step\n",
            "Epoch 175/300\n",
            "15/15 - 0s - loss: 0.0011 - 68ms/epoch - 5ms/step\n",
            "Epoch 176/300\n",
            "15/15 - 0s - loss: 0.0032 - 65ms/epoch - 4ms/step\n",
            "Epoch 177/300\n",
            "15/15 - 0s - loss: 0.0030 - 65ms/epoch - 4ms/step\n",
            "Epoch 178/300\n",
            "15/15 - 0s - loss: 0.0052 - 64ms/epoch - 4ms/step\n",
            "Epoch 179/300\n",
            "15/15 - 0s - loss: 0.0041 - 63ms/epoch - 4ms/step\n",
            "Epoch 180/300\n",
            "15/15 - 0s - loss: 0.0063 - 64ms/epoch - 4ms/step\n",
            "Epoch 181/300\n",
            "15/15 - 0s - loss: 0.0039 - 62ms/epoch - 4ms/step\n",
            "Epoch 182/300\n",
            "15/15 - 0s - loss: 0.0044 - 62ms/epoch - 4ms/step\n",
            "Epoch 183/300\n",
            "15/15 - 0s - loss: 0.0041 - 63ms/epoch - 4ms/step\n",
            "Epoch 184/300\n",
            "15/15 - 0s - loss: 0.0025 - 60ms/epoch - 4ms/step\n",
            "Epoch 185/300\n",
            "15/15 - 0s - loss: 0.0019 - 60ms/epoch - 4ms/step\n",
            "Epoch 186/300\n",
            "15/15 - 0s - loss: 0.0018 - 62ms/epoch - 4ms/step\n",
            "Epoch 187/300\n",
            "15/15 - 0s - loss: 0.0012 - 60ms/epoch - 4ms/step\n",
            "Epoch 188/300\n",
            "15/15 - 0s - loss: 0.0019 - 61ms/epoch - 4ms/step\n",
            "Epoch 189/300\n",
            "15/15 - 0s - loss: 0.0012 - 65ms/epoch - 4ms/step\n",
            "Epoch 190/300\n",
            "15/15 - 0s - loss: 0.0050 - 65ms/epoch - 4ms/step\n",
            "Epoch 191/300\n",
            "15/15 - 0s - loss: 0.0108 - 61ms/epoch - 4ms/step\n",
            "Epoch 192/300\n",
            "15/15 - 0s - loss: 0.0063 - 61ms/epoch - 4ms/step\n",
            "Epoch 193/300\n",
            "15/15 - 0s - loss: 0.0071 - 64ms/epoch - 4ms/step\n",
            "Epoch 194/300\n",
            "15/15 - 0s - loss: 0.0088 - 61ms/epoch - 4ms/step\n",
            "Epoch 195/300\n",
            "15/15 - 0s - loss: 0.0036 - 66ms/epoch - 4ms/step\n",
            "Epoch 196/300\n",
            "15/15 - 0s - loss: 0.0015 - 67ms/epoch - 4ms/step\n",
            "Epoch 197/300\n",
            "15/15 - 0s - loss: 0.0021 - 65ms/epoch - 4ms/step\n",
            "Epoch 198/300\n",
            "15/15 - 0s - loss: 0.0020 - 67ms/epoch - 4ms/step\n",
            "Epoch 199/300\n",
            "15/15 - 0s - loss: 0.0021 - 67ms/epoch - 4ms/step\n",
            "Epoch 200/300\n",
            "15/15 - 0s - loss: 0.0027 - 69ms/epoch - 5ms/step\n",
            "Epoch 201/300\n",
            "15/15 - 0s - loss: 0.0026 - 65ms/epoch - 4ms/step\n",
            "Epoch 202/300\n",
            "15/15 - 0s - loss: 0.0024 - 66ms/epoch - 4ms/step\n",
            "Epoch 203/300\n",
            "15/15 - 0s - loss: 0.0034 - 67ms/epoch - 4ms/step\n",
            "Epoch 204/300\n",
            "15/15 - 0s - loss: 0.0032 - 66ms/epoch - 4ms/step\n",
            "Epoch 205/300\n",
            "15/15 - 0s - loss: 0.0012 - 68ms/epoch - 5ms/step\n",
            "Epoch 206/300\n",
            "15/15 - 0s - loss: 0.0018 - 70ms/epoch - 5ms/step\n",
            "Epoch 207/300\n",
            "15/15 - 0s - loss: 0.0014 - 67ms/epoch - 4ms/step\n",
            "Epoch 208/300\n",
            "15/15 - 0s - loss: 4.2938e-04 - 67ms/epoch - 4ms/step\n",
            "Epoch 209/300\n",
            "15/15 - 0s - loss: 4.4445e-04 - 67ms/epoch - 4ms/step\n",
            "Epoch 210/300\n",
            "15/15 - 0s - loss: 0.0017 - 65ms/epoch - 4ms/step\n",
            "Epoch 211/300\n",
            "15/15 - 0s - loss: 0.0015 - 64ms/epoch - 4ms/step\n",
            "Epoch 212/300\n",
            "15/15 - 0s - loss: 8.4121e-04 - 68ms/epoch - 5ms/step\n",
            "Epoch 213/300\n",
            "15/15 - 0s - loss: 8.6864e-04 - 65ms/epoch - 4ms/step\n",
            "Epoch 214/300\n",
            "15/15 - 0s - loss: 7.9325e-04 - 69ms/epoch - 5ms/step\n",
            "Epoch 215/300\n",
            "15/15 - 0s - loss: 3.7669e-04 - 69ms/epoch - 5ms/step\n",
            "Epoch 216/300\n",
            "15/15 - 0s - loss: 2.2967e-04 - 70ms/epoch - 5ms/step\n",
            "Epoch 217/300\n",
            "15/15 - 0s - loss: 2.5277e-04 - 67ms/epoch - 4ms/step\n",
            "Epoch 218/300\n",
            "15/15 - 0s - loss: 0.0038 - 66ms/epoch - 4ms/step\n",
            "Epoch 219/300\n",
            "15/15 - 0s - loss: 0.0014 - 68ms/epoch - 5ms/step\n",
            "Epoch 220/300\n",
            "15/15 - 0s - loss: 0.0033 - 67ms/epoch - 4ms/step\n",
            "Epoch 221/300\n",
            "15/15 - 0s - loss: 0.0033 - 69ms/epoch - 5ms/step\n",
            "Epoch 222/300\n",
            "15/15 - 0s - loss: 0.0035 - 66ms/epoch - 4ms/step\n",
            "Epoch 223/300\n",
            "15/15 - 0s - loss: 0.0029 - 65ms/epoch - 4ms/step\n",
            "Epoch 224/300\n",
            "15/15 - 0s - loss: 0.0011 - 68ms/epoch - 5ms/step\n",
            "Epoch 225/300\n",
            "15/15 - 0s - loss: 8.1595e-04 - 68ms/epoch - 5ms/step\n",
            "Epoch 226/300\n",
            "15/15 - 0s - loss: 2.4373e-04 - 68ms/epoch - 5ms/step\n",
            "Epoch 227/300\n",
            "15/15 - 0s - loss: 5.2873e-04 - 69ms/epoch - 5ms/step\n",
            "Epoch 228/300\n",
            "15/15 - 0s - loss: 0.0015 - 70ms/epoch - 5ms/step\n",
            "Epoch 229/300\n",
            "15/15 - 0s - loss: 0.0014 - 75ms/epoch - 5ms/step\n",
            "Epoch 230/300\n",
            "15/15 - 0s - loss: 0.0029 - 74ms/epoch - 5ms/step\n",
            "Epoch 231/300\n",
            "15/15 - 0s - loss: 0.0087 - 69ms/epoch - 5ms/step\n",
            "Epoch 232/300\n",
            "15/15 - 0s - loss: 0.0044 - 66ms/epoch - 4ms/step\n",
            "Epoch 233/300\n",
            "15/15 - 0s - loss: 0.0060 - 66ms/epoch - 4ms/step\n",
            "Epoch 234/300\n",
            "15/15 - 0s - loss: 0.0029 - 66ms/epoch - 4ms/step\n",
            "Epoch 235/300\n",
            "15/15 - 0s - loss: 0.0040 - 67ms/epoch - 4ms/step\n",
            "Epoch 236/300\n",
            "15/15 - 0s - loss: 0.0014 - 67ms/epoch - 4ms/step\n",
            "Epoch 237/300\n",
            "15/15 - 0s - loss: 0.0028 - 68ms/epoch - 5ms/step\n",
            "Epoch 238/300\n",
            "15/15 - 0s - loss: 0.0012 - 67ms/epoch - 4ms/step\n",
            "Epoch 239/300\n",
            "15/15 - 0s - loss: 0.0044 - 70ms/epoch - 5ms/step\n",
            "Epoch 240/300\n",
            "15/15 - 0s - loss: 0.0022 - 67ms/epoch - 4ms/step\n",
            "Epoch 241/300\n",
            "15/15 - 0s - loss: 0.0040 - 72ms/epoch - 5ms/step\n",
            "Epoch 242/300\n",
            "15/15 - 0s - loss: 0.0084 - 68ms/epoch - 5ms/step\n",
            "Epoch 243/300\n",
            "15/15 - 0s - loss: 0.0069 - 70ms/epoch - 5ms/step\n",
            "Epoch 244/300\n",
            "15/15 - 0s - loss: 0.0014 - 71ms/epoch - 5ms/step\n",
            "Epoch 245/300\n",
            "15/15 - 0s - loss: 0.0038 - 70ms/epoch - 5ms/step\n",
            "Epoch 246/300\n",
            "15/15 - 0s - loss: 0.0018 - 66ms/epoch - 4ms/step\n",
            "Epoch 247/300\n",
            "15/15 - 0s - loss: 0.0024 - 70ms/epoch - 5ms/step\n",
            "Epoch 248/300\n",
            "15/15 - 0s - loss: 0.0046 - 67ms/epoch - 4ms/step\n",
            "Epoch 249/300\n",
            "15/15 - 0s - loss: 0.0026 - 67ms/epoch - 4ms/step\n",
            "Epoch 250/300\n",
            "15/15 - 0s - loss: 9.2622e-04 - 66ms/epoch - 4ms/step\n",
            "Epoch 251/300\n",
            "15/15 - 0s - loss: 0.0014 - 65ms/epoch - 4ms/step\n",
            "Epoch 252/300\n",
            "15/15 - 0s - loss: 0.0012 - 66ms/epoch - 4ms/step\n",
            "Epoch 253/300\n",
            "15/15 - 0s - loss: 0.0016 - 66ms/epoch - 4ms/step\n",
            "Epoch 254/300\n",
            "15/15 - 0s - loss: 4.3800e-04 - 66ms/epoch - 4ms/step\n",
            "Epoch 255/300\n",
            "15/15 - 0s - loss: 3.2262e-04 - 63ms/epoch - 4ms/step\n",
            "Epoch 256/300\n",
            "15/15 - 0s - loss: 4.5720e-04 - 66ms/epoch - 4ms/step\n",
            "Epoch 257/300\n",
            "15/15 - 0s - loss: 4.1797e-04 - 69ms/epoch - 5ms/step\n",
            "Epoch 258/300\n",
            "15/15 - 0s - loss: 0.0011 - 66ms/epoch - 4ms/step\n",
            "Epoch 259/300\n",
            "15/15 - 0s - loss: 0.0017 - 69ms/epoch - 5ms/step\n",
            "Epoch 260/300\n",
            "15/15 - 0s - loss: 7.1890e-04 - 69ms/epoch - 5ms/step\n",
            "Epoch 261/300\n",
            "15/15 - 0s - loss: 0.0026 - 66ms/epoch - 4ms/step\n",
            "Epoch 262/300\n",
            "15/15 - 0s - loss: 0.0035 - 69ms/epoch - 5ms/step\n",
            "Epoch 263/300\n",
            "15/15 - 0s - loss: 0.0024 - 67ms/epoch - 4ms/step\n",
            "Epoch 264/300\n",
            "15/15 - 0s - loss: 0.0027 - 70ms/epoch - 5ms/step\n",
            "Epoch 265/300\n",
            "15/15 - 0s - loss: 0.0063 - 67ms/epoch - 4ms/step\n",
            "Epoch 266/300\n",
            "15/15 - 0s - loss: 0.0107 - 69ms/epoch - 5ms/step\n",
            "Epoch 267/300\n",
            "15/15 - 0s - loss: 0.0032 - 68ms/epoch - 5ms/step\n",
            "Epoch 268/300\n",
            "15/15 - 0s - loss: 0.0093 - 67ms/epoch - 4ms/step\n",
            "Epoch 269/300\n",
            "15/15 - 0s - loss: 0.0032 - 68ms/epoch - 5ms/step\n",
            "Epoch 270/300\n",
            "15/15 - 0s - loss: 0.0018 - 67ms/epoch - 4ms/step\n",
            "Epoch 271/300\n",
            "15/15 - 0s - loss: 6.6569e-04 - 67ms/epoch - 4ms/step\n",
            "Epoch 272/300\n",
            "15/15 - 0s - loss: 8.4809e-04 - 66ms/epoch - 4ms/step\n",
            "Epoch 273/300\n",
            "15/15 - 0s - loss: 0.0017 - 64ms/epoch - 4ms/step\n",
            "Epoch 274/300\n",
            "15/15 - 0s - loss: 0.0018 - 64ms/epoch - 4ms/step\n",
            "Epoch 275/300\n",
            "15/15 - 0s - loss: 7.8043e-04 - 66ms/epoch - 4ms/step\n",
            "Epoch 276/300\n",
            "15/15 - 0s - loss: 0.0016 - 68ms/epoch - 5ms/step\n",
            "Epoch 277/300\n",
            "15/15 - 0s - loss: 0.0039 - 68ms/epoch - 5ms/step\n",
            "Epoch 278/300\n",
            "15/15 - 0s - loss: 0.0064 - 65ms/epoch - 4ms/step\n",
            "Epoch 279/300\n",
            "15/15 - 0s - loss: 0.0031 - 69ms/epoch - 5ms/step\n",
            "Epoch 280/300\n",
            "15/15 - 0s - loss: 3.6688e-04 - 71ms/epoch - 5ms/step\n",
            "Epoch 281/300\n",
            "15/15 - 0s - loss: 2.4098e-04 - 65ms/epoch - 4ms/step\n",
            "Epoch 282/300\n",
            "15/15 - 0s - loss: 2.1930e-04 - 69ms/epoch - 5ms/step\n",
            "Epoch 283/300\n",
            "15/15 - 0s - loss: 5.4284e-05 - 67ms/epoch - 4ms/step\n",
            "Epoch 284/300\n",
            "15/15 - 0s - loss: 1.6653e-04 - 66ms/epoch - 4ms/step\n",
            "Epoch 285/300\n",
            "15/15 - 0s - loss: 4.3145e-04 - 66ms/epoch - 4ms/step\n",
            "Epoch 286/300\n",
            "15/15 - 0s - loss: 5.3104e-04 - 66ms/epoch - 4ms/step\n",
            "Epoch 287/300\n",
            "15/15 - 0s - loss: 8.3065e-04 - 68ms/epoch - 5ms/step\n",
            "Epoch 288/300\n",
            "15/15 - 0s - loss: 0.0051 - 67ms/epoch - 4ms/step\n",
            "Epoch 289/300\n",
            "15/15 - 0s - loss: 0.0168 - 70ms/epoch - 5ms/step\n",
            "Epoch 290/300\n",
            "15/15 - 0s - loss: 0.0175 - 70ms/epoch - 5ms/step\n",
            "Epoch 291/300\n",
            "15/15 - 0s - loss: 0.0031 - 66ms/epoch - 4ms/step\n",
            "Epoch 292/300\n",
            "15/15 - 0s - loss: 0.0011 - 69ms/epoch - 5ms/step\n",
            "Epoch 293/300\n",
            "15/15 - 0s - loss: 0.0018 - 69ms/epoch - 5ms/step\n",
            "Epoch 294/300\n",
            "15/15 - 0s - loss: 0.0043 - 67ms/epoch - 4ms/step\n",
            "Epoch 295/300\n",
            "15/15 - 0s - loss: 0.0082 - 64ms/epoch - 4ms/step\n",
            "Epoch 296/300\n",
            "15/15 - 0s - loss: 0.0024 - 65ms/epoch - 4ms/step\n",
            "Epoch 297/300\n",
            "15/15 - 0s - loss: 0.0079 - 66ms/epoch - 4ms/step\n",
            "Epoch 298/300\n",
            "15/15 - 0s - loss: 0.0047 - 67ms/epoch - 4ms/step\n",
            "Epoch 299/300\n",
            "15/15 - 0s - loss: 0.0010 - 68ms/epoch - 5ms/step\n",
            "Epoch 300/300\n",
            "15/15 - 0s - loss: 0.0028 - 66ms/epoch - 4ms/step\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<keras.src.callbacks.History at 0x7866b0272b00>"
            ]
          },
          "metadata": {},
          "execution_count": 40
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "n-aNP4n3sqG_",
        "outputId": "7c519edf-c1ee-43dc-c884-394e9acc9265",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 443
        }
      },
      "source": [
        "# Plotting code, feel free to ignore.\n",
        "h = 1.0\n",
        "x_min, x_max = X[:, 0].min() - 5, X[:, 0].max() + 5\n",
        "y_min, y_max = X[:, 1].min() - 5, X[:, 1].max() + 5\n",
        "xx, yy = np.meshgrid(np.arange(x_min, x_max, h),\n",
        "                     np.arange(y_min, y_max, h))\n",
        "\n",
        "# here \"model\" is your model's prediction (classification) function\n",
        "Z = tn_model.predict(np.c_[xx.ravel(), yy.ravel()])\n",
        "\n",
        "# Put the result into a color plot\n",
        "Z = Z.reshape(xx.shape)\n",
        "plt.contourf(xx, yy, Z)\n",
        "plt.axis('off')\n",
        "\n",
        "# Plot also the training points\n",
        "plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired)"
      ],
      "execution_count": 41,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "5/5 [==============================] - 0s 4ms/step\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<matplotlib.collections.PathCollection at 0x78669c39f6d0>"
            ]
          },
          "metadata": {},
          "execution_count": 41
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 1 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "seconds = time.time()\n",
        "print(\"Time in seconds since end of run:\", seconds)\n",
        "local_time = time.ctime(seconds)\n",
        "print(local_time)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "s_ukr55OORqE",
        "outputId": "e3662cf8-5caa-44b3-faa5-a237461b374e"
      },
      "execution_count": 42,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Time in seconds since end of run: 1712717189.2349029\n",
            "Wed Apr 10 02:46:29 2024\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "seconds = time.time()\n",
        "print(\"Time in seconds since beginning of run:\", seconds)\n",
        "local_time = time.ctime(seconds)\n",
        "print(local_time)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "o8HTyvcHchzQ",
        "outputId": "4e68d027-a2e3-414a-a1a1-5b9f6f36d739"
      },
      "execution_count": 43,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Time in seconds since beginning of run: 1712717189.240212\n",
            "Wed Apr 10 02:46:29 2024\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Function to compute saliency map\n",
        "@tf.function\n",
        "def compute_saliency(input_image):\n",
        "    with tf.GradientTape() as tape:\n",
        "        tape.watch(input_image)\n",
        "        predictions = tn_model(input_image)\n",
        "    grads = tape.gradient(predictions, input_image)\n",
        "    saliency_map = tf.reduce_max(tf.abs(grads), axis=-1)\n",
        "    return saliency_map\n",
        "\n",
        "# Function to compute saliency map using Gradient\n",
        "@tf.function\n",
        "def compute_gradient_saliency(input_image):\n",
        "    with tf.GradientTape() as tape:\n",
        "        tape.watch(input_image)\n",
        "        predictions = tn_model(input_image)\n",
        "    grads = tape.gradient(predictions, input_image)\n",
        "    saliency_map = tf.reduce_max(tf.abs(grads), axis=-1)\n",
        "    return saliency_map\n",
        "\n",
        "# Compute saliency map for the entire grid\n",
        "def compute_saliency_map_grid():\n",
        "    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))\n",
        "    input_image = np.c_[xx.ravel(), yy.ravel()]\n",
        "    saliency_map = compute_saliency(tf.constant(input_image, dtype=tf.float32)).numpy()\n",
        "    saliency_map = saliency_map.reshape(xx.shape)\n",
        "    return xx, yy, saliency_map\n",
        "\n",
        "# Compute and plot saliency map for the entire grid\n",
        "xx, yy, saliency_map = compute_saliency_map_grid()\n",
        "\n",
        "# Compute saliency maps for all data points\n",
        "def compute_saliency_maps():\n",
        "    saliency_maps = []\n",
        "    for data_point in X:\n",
        "        saliency_map = compute_gradient_saliency(tf.constant(data_point[None, :], dtype=tf.float32)).numpy()\n",
        "        saliency_maps.append(saliency_map)\n",
        "    return saliency_maps\n",
        "\n",
        "# Find the indices of the data points with the highest saliency values\n",
        "def find_top_indices(saliency_maps, top_k):\n",
        "    top_indices = np.argsort(np.max(saliency_maps, axis=1))[-top_k:]\n",
        "    return top_indices\n",
        "\n",
        "def plot_most_diagnostic(top_indices, top_k, normalized_saliency_values):\n",
        "    plt.figure(figsize=(8, 6))\n",
        "    plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired)\n",
        "    plt.scatter(X[top_indices, 0], X[top_indices, 1], marker='o', s=200, facecolors='none', edgecolors='r', linewidths=2)\n",
        "    for i, index in enumerate(top_indices):\n",
        "        plt.annotate(f'{normalized_saliency_values.iloc[index][\"Saliency\"]:.4f}', (X[index, 0], X[index, 1]), xytext=(X[index, 0]+0.35, X[index, 1]+0.25), arrowprops=dict(facecolor='black', arrowstyle='->'))\n",
        "    plt.title(f'Saliency Most Diagnostic Data Points (Top {top_k})')\n",
        "    plt.xlabel('Feature 1')\n",
        "    plt.ylabel('Feature 2')\n",
        "    plt.grid(True)\n",
        "    plt.axis('equal')\n",
        "    plt.show()\n",
        "\n",
        "# Compute saliency maps for all data points\n",
        "saliency_maps = compute_saliency_maps()\n",
        "\n",
        "# Find the indices of the data points with the highest saliency values\n",
        "top_k = 5  # Number of top diagnostic data points to select\n",
        "top_indices = find_top_indices(saliency_maps, top_k)\n",
        "\n",
        "# Create a DataFrame to store the saliency values\n",
        "saliency_df = pd.DataFrame(data=saliency_maps, columns=[\"Saliency\"])\n",
        "\n",
        "# Save the saliency values to a CSV file\n",
        "saliency_df.to_csv(\"saliency_values.csv\", index=False)\n",
        "\n",
        "print(\"Saliency values saved to saliency_values.csv\")\n",
        "\n",
        "# Normalizing the saliency values\n",
        "normalized_saliency = (saliency_df - saliency_df.min()) / (saliency_df.max() - saliency_df.min())\n",
        "\n",
        "# Saving the normalized saliency values to a new CSV file\n",
        "normalized_saliency.to_csv(\"normalized_saliency_values.csv\", index=False)\n",
        "\n",
        "# Plot the most diagnostic data points\n",
        "plot_most_diagnostic(top_indices, top_k, normalized_saliency)\n",
        "\n",
        "print(\"Normalized saliency values saved to normalized_saliency_values.csv\")\n",
        "print(\"Normalized Saliency Top-k:\")\n",
        "print(normalized_saliency.nlargest(top_k, 'Saliency'))\n",
        "print(\"Normalized Saliency Max:\", normalized_saliency.max())\n",
        "print(\"Normalized Saliency Min:\", normalized_saliency.min())\n",
        "print(\"Normalized Saliency Mean:\", normalized_saliency.mean())\n",
        "print(\"Normalized Saliency Median:\", normalized_saliency.median())\n",
        "print(\"Normalized Saliency Mode:\", normalized_saliency.mode())\n",
        "sum_normalized_values = normalized_saliency.sum()\n",
        "print(\"Normalized Saliency Sum:\", sum_normalized_values)\n",
        "print(\"#\")\n",
        "print(\"#\")\n",
        "print(\"#\")\n",
        "print(\"Normalized Saliency Standard Deviation:\", normalized_saliency.std())\n",
        "print(\"Normalized Saliency Skewness:\", normalized_saliency.skew())\n",
        "print(\"Normalized Saliency Kurtosis:\", normalized_saliency.kurtosis())\n",
        "print(\"Normalized Saliency Variance:\", normalized_saliency.var())\n",
        "coefficient_variation = (normalized_saliency.std() / normalized_saliency.mean()) * 100\n",
        "print(\"Normalized Saliency Coefficient of Variation:\", coefficient_variation)\n",
        "print(\"#\")\n",
        "print(\"#\")\n",
        "print(\"#\")\n",
        "cumulative_sum = normalized_saliency.cumsum()\n",
        "print(\"Cumulative Sum of Normalized Saliency Values:\", cumulative_sum)\n",
        "mean_cumulative_sum = cumulative_sum / len(normalized_saliency)\n",
        "print(\"Mean of Cumulative Sum of Normalized Saliency Values:\", mean_cumulative_sum)\n",
        "rms = np.sqrt(np.mean(normalized_saliency**2))\n",
        "print(\"Normalized Saliency Root Mean Square:\", rms)\n",
        "q1 = normalized_saliency.quantile(0.25)\n",
        "q2 = normalized_saliency.quantile(0.75)\n",
        "iqr = q2 - q1\n",
        "print(\"Normalized Saliency 25th Percentile:\", q1)\n",
        "print(\"Normalized Saliency 75th Percentile:\", q2)\n",
        "print(\"Normalized Saliency Interquartile Range:\", iqr)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1843
        },
        "id": "95xed6YyDClf",
        "outputId": "d76f5ff1-b49a-4ce0-f1b3-227c902c5825"
      },
      "execution_count": 44,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Saliency values saved to saliency_values.csv\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 800x600 with 1 Axes>"
            ],
            "image/png": "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5513smXLFmbNmsWtt97KF198ccK43rfeeovzzz+f4uJiZsyYwZNPPsmgQYNYunQpAH/5y19wOp0sWrSo3n52u53Fixdz6aWXqurxOuOMM+jcubMn6QZYtGgRYWFhnH/++Se0t9lsjB07lnfffZdrrrmGf/7zn0RGRjJ16lRP4guwbNkyrr76aqKjo3nqqad48sknGTt2LCtXrvTc71133QXAQw89xLvvvsu7775L7969vcbcmL/85S8AXhO+559/nsGDB/PYY4/xxBNPoNfrufzyy/nqq6/qtZs6dSovvPAC5513Hk899RQhISENPid1rrjiCioqKpg7dy5XXHEFb731lmfoQ50bbriBmTNnMmTIEJ577jnGjBnD3Llzueqqqzxt8vPzmTBhAvv37+fBBx/khRde4JprrvH0zsbHx3v+kLvkkks8z92f/vSnRmObPXs2f/nLXzAYDDz22GPMnj2b1NRUvvvuuyafK28aes4/+ugjrFYrt956Ky+88AITJ07khRde4Nprr/W0ufnmmzn77LMBPPG/++67ntvVniNfZGdnAxAbG6v6ddwUb+f73XffxWQyMXr0aM/ju/nmmwG45ZZbeOmll7j00kv597//zb333ktISAg7d+5s8j5XrVoFwJAhQ3x67G+99RZXXHEFOp2OuXPncuONN/Lxxx9z+umnU1paWq+ty+XinHPOITExkaeffpqhQ4cya9YsZs2apeq+rFYrERERREZGEhMTw+23305lZWWDbYcOHep5TEI0ShFCNNu3336r6HQ6RafTKSNHjlTuv/9+5ZtvvlHsdvsJba1W6wnbJk6cqHTr1q3etjFjxihjxozx/J6Tk6MAyptvvunZdtZZZyn9+/dXqqurPdvcbrcyatQopUePHp5tb775pgIo48ePV9xut2f7Pffco+h0OqW0tFRRFEUpLS1VwsPDlREjRig2m61ePL/fb+TIkcqIESPq3f7xxx8rgPL999838Az9ZtasWQqgFBQUKPfee6+SkZHhue2UU05Rpk2bpiiKogDK7bff7rlt/vz5CqD85z//8Wyz2+3KyJEjlbCwMKW8vFxRFEX561//qkRERChOp7PRGD766CNVsTYUc0NKSkoUQLnkkks826ZMmaJ06dKlXrs/nnu73a7069dPGTdunGfbhg0bFEC5++6767WdOnWqAiizZs06Ia7rrruuXttLLrlEiY2N9fy+efNmBVBuuOGGeu3uvfdeBVC+++47RVEU5ZNPPlEAZd26dY08E4pSUFBwQhx/jKfOnj17FK1Wq1xyySWKy+Wq1/b3r6eGNOc5b+i9NXfuXEWj0SgHDhzwbLv99tuVxr721JyjxkyZMkUJDQ1VCgoKlIKCAmXv3r3KE088oWg0GmXAgAGKoqh/HSuK0uzzrSiKEhoaqkyZMuWEGCMjI+u9r9R65JFHFECpqKhotM26devqfUbZ7XYlISFB6devX73Pky+//FIBlJkzZ3q2TZkyRQGUO++807PN7XYr559/vmI0Ght9HdR58MEHlQceeEBZtGiR8v7773uOd9pppykOh+OE9k888YQCKHl5eWqfAtEBSc+xECfh7LPPZvXq1Vx00UVs2bKFp59+mokTJ9KpU6cThjiEhIR4fi4rK6OwsJAxY8awb98+ysrKVN9ncXEx3333nacXqbCwkMLCQoqKipg4cSJ79uw54dLlTTfdVO8S8ujRo3G5XBw4cACo7XWtqKjgwQcfPKH39/f7XXvttaxZs8bTIwbw3nvvkZqaypgxY1Q/hsmTJ7N3717WrVvn+b+xIRVLliwhKSnJMxkIasf13nXXXVRWVvLjjz8CEBUVRVVVVb3L7YEWFhYG1F6ybsrvz31JSQllZWWMHj263iXtuh762267rd6+TU3qvOWWW+r9Pnr0aIqKijyXl5csWQLA9OnT67X729/+BuDpFa0bFvTll1/icDiafCxqfPrpp7jdbmbOnIlWW/9r5mRLvjX0nP/++a2qqqKwsJBRo0ahKAqbNm1SdVw156gpVVVVxMfHEx8fT0ZGBg899BAjR470XMlR+zpuirfz3ZSoqCjWrFnD0aNHVT2eOkVFRej1es/zrsb69evJz8/ntttuq/d5cv7555OZmdlgb/zvr2TVVayx2+0sX768yfuaO3cuTz75JFdccQVXXXUVb731Fo8//jgrV65scFhMdHQ0AIWFhaofj+h4JDkW4iSdcsopfPzxx5SUlLB27VpmzJhBRUUFl112GTt27PC0W7lyJePHjyc0NJSoqCji4+N56KGHAHxKjvfu3YuiKPz973/3fBnX/au7DPnHyYBpaWn1fq/7gigpKQF+u/zbr1+/Ju/7yiuvxGQy8d5773ni/vLLL7nmmmt8SnoGDx5MZmYmCxcu5L333iMpKYlx48Y12PbAgQP06NHjhCSrbjhEXYJ/22230bNnT84991w6d+7Mdddd50k4A6Xu0q23me9ffvklp556KmazmZiYGM8whd+f9wMHDqDVaklPT6+3b0ZGRqPH9XZe6475x2MkJSURFRXlee7GjBnDpZdeyuzZs4mLi+Piiy8+qbJp2dnZaLVa+vTp06z9m9LQc37w4EGmTp1KTEwMYWFhxMfHe/5YU/veUnOOmmI2m1m2bBnLli3jf//7H4cOHWLlypV069YNUP86boq3892Up59+mm3btpGamsrw4cN59NFH2bdvn6rH5qu6x9KrV68TbsvMzDzhsWq1Ws/zVKdnz54Aqssu/t4999yDVqttMLFWjo9jlrrcoimSHAvhJ0ajkVNOOYUnnniCl156CYfDwUcffQTUJgtnnXUWhYWFzJs3j6+++oply5Zxzz33APhU+quu7b333uv5Mv7jvz8mQzqdrsFjKT5MeIHaL+MLLrjAkxwvXryYmpqaZs1Qnzx5MosWLWLhwoVceeWVJyQNvkpISGDz5s18/vnnXHTRRXz//fece+65TJky5aSO25S6seZNJbA//fSTZ6b/v//9b5YsWcKyZcuYPHmyz8//H6k9r94SAY1Gw+LFi1m9ejV33HEHR44c4brrrmPo0KGNjt1sLX98zl0uF2effTZfffUVDzzwAJ9++inLli3zTGBV897yxznS6XSMHz+e8ePHM3r0aDp37ty8B+jlPhqiJsYrrriCffv28cILL5CSksI///lP+vbty9dff93kfrGxsTidTq9XR9qSkJAQYmNjKS4uPuG2uj8kfl8JRYg/klJuQgTAsGHDADh27BgAX3zxBTU1NXz++ef1en++//57n49d18NiMBiaNYO8IXX1SLdt29Zkoge1Qysuvvhi1q1bx3vvvcfgwYPp27evz/c5efJkZs6cybFjx+pNjPqjLl268Ouvv+J2u+sl0HXVLrp06eLZZjQaufDCC7nwwgtxu93cdtttvPLKK/z9738nIyPD771FdXFPnDix0Tb//e9/MZvNfPPNN5hMJs/2N998s167Ll264Ha7ycnJoUePHp7te/fubXZ8dcfcs2dPvYmHeXl5lJaW1nvuAE499VROPfVUHn/8cRYuXMg111zDBx98wA033ODTc9e9e3fcbjc7duxg0KBBzY6/IX98zrdu3UpW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vn258sor6407zs/P5+WXX2bbtm2YzWbOPPNMrr32WukRFi3CarUyefJkSY7r3HzzzaxevZpff/21yXb79u2je/fuLF++3DNm6o+k57htC4a/XtsTt6KwZGeez5PvxveIIyrE6PP9yfltv+Tctm9yftu3YDi/anuO1V3HbAOamnWblJTU5L5VVVV88MEHPPbYY17vp1u3bsTFxbF3795Gk2OTyeSZcft7BoOhzb4gOiI5H4HnVhRyCiqpdmtAq77np3diOPERoSd133J+2y85t+2bnN/2rS2fX7VxBc2EvD9OMgA8s25/35PckI8++oiamhr+/Oc/e72fw4cPU1RURHJy8knHLER7trewks+2HWPDkTLV+4SZ9AxPi2ZgslxhEUII0TYFTc8x1M66nTJlCsOGDWP48OHMnz+fqqoqpk2bBsC1115Lp06dmDt3br39/u///o9JkyadMMmusrKS2bNnc+mll5KUlER2djb3338/GRkZTJw4scUelxDBZkdeBVuOqk+KobaGcZdoi6euqRBCCNEWBVVyfOWVV1JQUMDMmTPJzc1l0KBBLF261LMS0MGDB09YxWf37t38/PPPfPvttyccT6fT8euvv/L2229TWlpKSkoKEyZMYM6cOQ0OmxBCQLXDxa8+JsahRp0kxkK0IVarFYPBgF6v57///S9hYWEMHTqURx55BJvNxjvvvNPaIQrRaoIqOQa44447uOOOOxq87YcffjhhW69evWhszmFISAjffPONP8MTot3bX6K+hjHUlms7JTVaEmMhWlFxcTHPP/885557Lt9//z3/+Mc/uOuuu1i5ciU//fQT5557LqtXrwZgwYIFrRytEK0r6JJjIUTrKKqyszO/gkOlNtX7xFgMDE6JIiFcrsQI0ZIqKiqYM2cOzz//PDNmzGDBggVYrVb+7//+j9zcXPr168dTTz1FWloa6enpLF26lOuvv54nnniC+Pj41g5fiFYlybEQwquDJVZW7S/2aZ8JPROIDfW9VJsQovkURWHhwoXcd999FBUVERcXx+zZs0lNTaWoqIjw8HAqKyvJzs5m0KBBbNq0ieHDh7No0SJOOeWU1g5fiDYhaKpVCCFaR7XDxeoDxSigajiFBkiOMEtiLEQL27x5M2eccQZ//vOfMRqN2O123G635+du3bqxa9cuunfvjsvl4vDhw7zxxhusXr1a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PIA77rij1zYFBQVwOp2oq6vrcTwQCKCxsVHVXOH//u//hsfjwZIlS/psW1xcjLVr18Lr9cJgMJyzjcFgOOd9Op0uZn8hhiP2R2IbTv2r0wETTD3fc7yBII40eNDcVQzDoJVw+HRbqIpeXCfLsuacyXH385KlzgWCAGA36TAxMxlmvQbegAKzTgO7KfGKnySS4fTaHY5iuX/VxhXV5Dg9PR3p6el9tps5cyaam5uxc+dOTJs2DQDw2WefQVEUFBcX93n+r371K/zwhz9U9Vh79uxBSkrKeRNjIqJYYNBqMD4zucexSU4bqlwdnRXyNDKS9BocOu3GqZbO4iSSBGglKeYT6O7YtLKEjCQD3N4AgkIg1aLHBWlJcJj1aPd3ztHm1mpENNji4num8ePHY+HChVi2bBlee+01+P1+rFy5EjfffHNop4pTp05h7ty5ePPNNzFjxozQueXl5diyZQs++uijs677wQcfoLa2FpdccgmMRiNKSkrwzDPP4MEHHxyy50ZENFg0soRcu6nHsYxkI/xBBb5gZ5EOWZJQ5erAyeZ2BBUBq1ELvUaDIw1uNHdt1WbWaSBLPYtunJlMS103zkyuz1WxrvscjSyFKvIBgEaSkJGshz+gwOUNQCvLyEsxIc+qw5cngclZViSbDMi2maA9TwW/JENc/PkiojgUN+8uGzduxMqVKzF37txQEZCXX345dL/f70dZWdlZk61//etfIycnB/Pnzz/rmjqdDuvXr8dPf/pTCCFQWFiIl156CcuWLYv48yEiGio6jdyjoluOzYQcW88kemxGEnwBBQKdRTskSUJLux+NHh9kWUJmkgEaWcLxpna0egPQaSTkpZghATjW5EFHQIFJp0G+wwxFETjV0pl820w6ZFmNCCoCTe2dK8VTTLpzVpjrXkl+QXpSzH4tS0SJL26SY4fDcd6CHwCQn58PcY56os888wyeeeaZc56zcOHCHsU/iIiGM722Z8JqM+lgM/VMUkenWc46b6Lz7IXIYzN6TvmQNZ1TJIiIYh2LwxMRERERdWFyTERERETUhckxEREREVEXJsdERERERF2YHBMRERERdWFyTERERETUhckxEREREVEXJsdERERERF2YHBMRERERdWFyTERERETUhckxEREREVEXJsdERERERF2YHBMRERERdWFyTERERETURRvtABKBEAIA4HK5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f6CmT58e+v+2tjZUVFTgzjvvxLJly0LHA4EAbDbbgB+LiGioMDkmIophFosFhYWFZx13u91Ys2ZNj5HbbkajEUePHsUPfvAD3H333Xj66afhcDjw5Zdf4s4774TP5+s1OZYkCUKIHsfOteCuO1HvjgcA/uu//gvFxcU92nXPkSYiigdMjomI4tBFF12EsrKycybOALBz504oioIXX3wRsty59vqdd97p0Uav1yMYDJ51bnp6Oqqrq0O3Dx8+DI/H02s8mZmZyM7OxpEjR7B48eJwnw4RUcxgckxEFIcef/xx/OAHP0BeXh7+4R/+AbIsY+/evdi/fz+eeuopFBYWwu/345VXXsG1116LrVu34rXXXutxjfz8fLjdbmzevBlTpkyB2WyG2WzGnDlz8POf/xwzZ85EMBjEI488Ap1O12dMa9aswX333QebzYaFCxfC6/Vix44daGpqwqpVq855jtvt7rFvc2VlJfbs2QOHw4G8vLyB/SMREfUDt3IjIopDCxYswIcffohNmzbh4osvxiWXXIJ/+7d/w8iRIwEAU6ZMwUsvvYRnn30WkyZNwsaNG7Fu3boe15g1axZWrFiBH//4x0hPT8dzzz0HAHjxxReRm5uLyy67DLfeeisefPBBVXOU77rrLrz++ut44403MHnyZMyePRsbNmzodV/mHTt2oKioCEVFRQCAVatWoaioCI8//nh//2mIiAZEEt+fWEZERERENExx5JiIiIiIqAuTYyIiIiKiLkyOiYiIiIi6MDkmIiIiIurC5JiIiIiIqAuTYyIiIiKiLkyOiYiIiIi6MDkmIiIiIurC5JiIiIiIqAuTYyIiIiKiLkyOiYiIiIi6/H9SxB8hmKNUvwAAAABJRU5ErkJggg==\n"
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Normalized saliency values saved to normalized_saliency_values.csv\n",
            "Normalized Saliency Top-k:\n",
            "     Saliency\n",
            "240  1.000000\n",
            "239  0.999336\n",
            "241  0.212899\n",
            "238  0.013040\n",
            "242  0.010405\n",
            "Normalized Saliency Max: Saliency    1.0\n",
            "dtype: float32\n",
            "Normalized Saliency Min: Saliency    0.0\n",
            "dtype: float32\n",
            "Normalized Saliency Mean: Saliency    0.005346\n",
            "dtype: float32\n",
            "Normalized Saliency Median: Saliency    0.000347\n",
            "dtype: float32\n",
            "Normalized Saliency Mode:    Saliency\n",
            "0       0.0\n",
            "Normalized Saliency Sum: Saliency    2.566197\n",
            "dtype: float32\n",
            "#\n",
            "#\n",
            "#\n",
            "Normalized Saliency Standard Deviation: Saliency    0.065117\n",
            "dtype: float32\n",
            "Normalized Saliency Skewness: Saliency    14.99575\n",
            "dtype: float32\n",
            "Normalized Saliency Kurtosis: Saliency    227.062485\n",
            "dtype: float32\n",
            "Normalized Saliency Variance: Saliency    0.00424\n",
            "dtype: float32\n",
            "Normalized Saliency Coefficient of Variation: Saliency    1217.99231\n",
            "dtype: float32\n",
            "#\n",
            "#\n",
            "#\n",
            "Cumulative Sum of Normalized Saliency Values:      Saliency\n",
            "0    0.000000\n",
            "1    0.000000\n",
            "2    0.000000\n",
            "3    0.000000\n",
            "4    0.000000\n",
            "..        ...\n",
            "475  2.563557\n",
            "476  2.563867\n",
            "477  2.564618\n",
            "478  2.565408\n",
            "479  2.566200\n",
            "\n",
            "[480 rows x 1 columns]\n",
            "Mean of Cumulative Sum of Normalized Saliency Values:      Saliency\n",
            "0    0.000000\n",
            "1    0.000000\n",
            "2    0.000000\n",
            "3    0.000000\n",
            "4    0.000000\n",
            "..        ...\n",
            "475  0.005341\n",
            "476  0.005341\n",
            "477  0.005343\n",
            "478  0.005345\n",
            "479  0.005346\n",
            "\n",
            "[480 rows x 1 columns]\n",
            "Normalized Saliency Root Mean Square: 0.065268286\n",
            "Normalized Saliency 25th Percentile: Saliency    0.000202\n",
            "Name: 0.25, dtype: float64\n",
            "Normalized Saliency 75th Percentile: Saliency    0.000997\n",
            "Name: 0.75, dtype: float64\n",
            "Normalized Saliency Interquartile Range: Saliency    0.000795\n",
            "dtype: float64\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "seconds = time.time()\n",
        "print(\"Time in seconds since end of run:\", seconds)\n",
        "local_time = time.ctime(seconds)\n",
        "print(local_time)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 0
        },
        "id": "wfZCzuq9KY9b",
        "outputId": "e8696225-d5f9-4033-924d-f6ab3169a7cb"
      },
      "execution_count": 45,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Time in seconds since end of run: 1712717190.6785126\n",
            "Wed Apr 10 02:46:30 2024\n"
          ]
        }
      ]
    }
  ]
}